{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-09-02T17:03:36.351409Z",
     "start_time": "2019-09-02T17:03:36.345139Z"
    }
   },
   "outputs": [],
   "source": [
    "import os\n",
    "\n",
    "os.environ[\"CUDA_VISIBLE_DEVICES\"] = \"6\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-09-02T17:03:41.423627Z",
     "start_time": "2019-09-02T17:03:36.431238Z"
    }
   },
   "outputs": [],
   "source": [
    "%reload_ext autoreload\n",
    "%autoreload 2\n",
    "%matplotlib inline\n",
    "import torch\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "from matplotlib import style\n",
    "import seaborn as sns\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "from joblib import load, dump\n",
    "from sklearn.metrics import cohen_kappa_score\n",
    "from sklearn.metrics import confusion_matrix\n",
    "from fastai import *\n",
    "from fastai.vision import *\n",
    "from fastai.callbacks import *\n",
    "from torchvision import models as md\n",
    "from torch import nn\n",
    "from torch.nn import functional as F\n",
    "import re\n",
    "import math\n",
    "import collections\n",
    "from functools import partial\n",
    "from torch.utils import model_zoo\n",
    "from sklearn import metrics\n",
    "from collections import Counter\n",
    "import json\n",
    "from efficientnet_pytorch import EfficientNet\n",
    "from utils import *"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-09-02T17:03:41.461449Z",
     "start_time": "2019-09-02T17:03:41.425678Z"
    }
   },
   "outputs": [],
   "source": [
    "import random\n",
    "\n",
    "def seed_everything(seed):\n",
    "    random.seed(seed)\n",
    "    os.environ['PYTHONHASHSEED'] = str(seed)\n",
    "    np.random.seed(seed)\n",
    "    torch.manual_seed(seed)\n",
    "    torch.cuda.manual_seed(seed)\n",
    "    torch.backends.cudnn.deterministic = True\n",
    "SEED = 2019\n",
    "seed_everything(SEED)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-09-02T17:03:41.511509Z",
     "start_time": "2019-09-02T17:03:41.469981Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0903_01-03-41\n"
     ]
    }
   ],
   "source": [
    "current_time = get_BJ_time()\n",
    "print(current_time)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Reading data and Basic EDA(Exploratory Data Analysis)\n",
    "\n",
    "Here I am going to open the dataset with pandas, check distribution of labels."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-09-02T17:03:41.569730Z",
     "start_time": "2019-09-02T17:03:41.513726Z"
    }
   },
   "outputs": [],
   "source": [
    "df_2019_cv = pd.read_csv('../input/aptos-data-split/df_2019_cv.csv')\n",
    "\n",
    "test_df = pd.read_csv('../input/aptos2019-blindness-detection/sample_submission.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-09-02T17:03:41.603187Z",
     "start_time": "2019-09-02T17:03:41.571461Z"
    }
   },
   "outputs": [],
   "source": [
    "bs = 24 #smaller batch size is better for training, but may take longer\n",
    "sz = 256  # get model input size\n",
    "# sz = EfficientNet.get_image_size(model_name)  # get model input size\n",
    "tfms = get_transforms(do_flip=True,flip_vert=True, max_rotate=0, max_zoom=1.2, max_warp=0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Training (Transfer learning)\n",
    "The Kaggle competition used the Cohen's quadratically weighted kappa so I have that here to compare. This is a better metric when dealing with imbalanced datasets like this one, and for measuring inter-rater agreement for categorical classification (the raters being the human-labeled dataset and the neural network predictions). Here is an implementation based on the scikit-learn's implementation, but converted to a pytorch tensor, as that is what fastai uses."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-09-02T17:03:41.635737Z",
     "start_time": "2019-09-02T17:03:41.604970Z"
    }
   },
   "outputs": [],
   "source": [
    "def qk(y_pred, y):\n",
    "    k = torch.tensor(cohen_kappa_score(torch.round(y_pred), y, weights='quadratic'), device='cuda:0')\n",
    "    k[k != k] = 0\n",
    "    k[torch.isinf(k)] = 0\n",
    "    \n",
    "    return k"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Fold 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-19T17:51:48.305578Z",
     "start_time": "2019-08-19T17:51:44.431106Z"
    }
   },
   "outputs": [],
   "source": [
    "data1 = (ImageList.from_df(df=df_2019_cv,path='../input/aptos2019-blindness-detection',cols='id_code', folder='train_images_ben_preprocessing_sigmaX10', suffix='.png')\n",
    "        .split_from_df(\"is_valid1\")\n",
    "        .label_from_df(cols='diagnosis',label_cls=FloatList) \n",
    "        .transform(tfms,size=sz,resize_method=ResizeMethod.SQUISH,padding_mode='zeros') \n",
    "        .databunch(bs=bs,num_workers=4) \n",
    "        .normalize(imagenet_stats)  \n",
    "       )\n",
    "\n",
    "model_name = 'efficientnet-b5'\n",
    "model = EfficientNet.from_pretrained(model_name, num_classes=1)\n",
    "\n",
    "learn = Learner(data1, \n",
    "                model, \n",
    "                path = \".\",\n",
    "                metrics = [qk],\n",
    "                callback_fns=[partial(EarlyStoppingCallback, min_delta=0, patience=3)],\n",
    "                model_dir = '../output/models/')\n",
    "\n",
    "learn.data.add_test(ImageList.from_df(test_df,\n",
    "                                      '../input/aptos2019-blindness-detection',\n",
    "                                      folder='test_images_ben_preprocessing_sigmaX10',\n",
    "                                      suffix='.png'))\n",
    "\n",
    "learn.load(\"efficientnet-b5_0812_22-06-45_stage1\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-19T19:41:00.925754Z",
     "start_time": "2019-08-19T19:40:37.209419Z"
    }
   },
   "outputs": [],
   "source": [
    "# Explore lr from `start_lr` to `end_lr` over `num_it` iterations in `learn`. If `stop_div`, stops when loss diverges.\n",
    "learn.lr_find() \n",
    "learn.recorder.plot(suggestion=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-19T20:25:29.190127Z",
     "start_time": "2019-08-19T20:21:45.807835Z"
    }
   },
   "outputs": [],
   "source": [
    "model_save_name = \"{}_{}_stage2_f1\".format(model_name, current_time)\n",
    "# min_grad_lr = learn.recorder.min_grad_lr\n",
    "learn.fit_one_cycle(40, 8e-7, callbacks=[SaveModelCallback(learn, every='improvement', name=model_save_name)])\n",
    "print(\"Model save as:\", model_save_name)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-19T20:25:29.618346Z",
     "start_time": "2019-08-19T20:25:29.192334Z"
    }
   },
   "outputs": [],
   "source": [
    "learn.recorder.plot_losses()\n",
    "learn.recorder.plot_metrics()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-19T20:25:31.857823Z",
     "start_time": "2019-08-19T20:25:29.621770Z"
    }
   },
   "outputs": [],
   "source": [
    "learn.load(model_save_name)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Fold 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-09-02T17:06:48.817678Z",
     "start_time": "2019-09-02T17:04:29.876975Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Loaded pretrained weights for efficientnet-b5\n",
      "Reload\n"
     ]
    }
   ],
   "source": [
    "data1 = (ImageList.from_df(df=df_2019_cv,path='../input/aptos2019-blindness-detection',cols='id_code', folder='train_images_ben_preprocessing_sigmaX10', suffix='.png')\n",
    "        .split_from_df(\"is_valid2\")\n",
    "        .label_from_df(cols='diagnosis',label_cls=FloatList) \n",
    "        .transform(tfms,size=sz,resize_method=ResizeMethod.SQUISH,padding_mode='zeros') \n",
    "        .databunch(bs=bs,num_workers=4) \n",
    "        .normalize(imagenet_stats)  \n",
    "       )\n",
    "\n",
    "model_name = 'efficientnet-b5'\n",
    "model = EfficientNet.from_pretrained(model_name, num_classes=1)\n",
    "\n",
    "learn = Learner(data1, \n",
    "                model, \n",
    "                path = \".\",\n",
    "                metrics = [qk],\n",
    "                callback_fns=[partial(EarlyStoppingCallback, min_delta=0, patience=3)],\n",
    "                model_dir = '../output/models/')\n",
    "\n",
    "learn.data.add_test(ImageList.from_df(test_df,\n",
    "                                      '../input/aptos2019-blindness-detection',\n",
    "                                      folder='test_images_ben_preprocessing_sigmaX10',\n",
    "                                      suffix='.png'))\n",
    "\n",
    "learn.load(\"efficientnet-b5_0902_04-26-49_stage1\")\n",
    "print(\"Reload\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-09-02T18:01:50.323390Z",
     "start_time": "2019-09-02T18:01:20.420803Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "LR Finder is complete, type {learner_name}.recorder.plot() to see the graph.\n",
      "Min numerical gradient: 6.31E-07\n",
      "Min loss divided by 10: 2.29E-07\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Explore lr from `start_lr` to `end_lr` over `num_it` iterations in `learn`. If `stop_div`, stops when loss diverges.\n",
    "learn.lr_find() \n",
    "learn.recorder.plot(suggestion=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-09-02T18:13:40.556739Z",
     "start_time": "2019-09-02T18:05:15.939864Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "        <style>\n",
       "            /* Turns off some styling */\n",
       "            progress {\n",
       "                /* gets rid of default border in Firefox and Opera. */\n",
       "                border: none;\n",
       "                /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "                background-size: auto;\n",
       "            }\n",
       "            .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "                background: #F44336;\n",
       "            }\n",
       "        </style>\n",
       "      <progress value='8' class='' max='40', style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      20.00% [8/40 07:27<29:50]\n",
       "    </div>\n",
       "    \n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: left;\">\n",
       "      <th>epoch</th>\n",
       "      <th>train_loss</th>\n",
       "      <th>valid_loss</th>\n",
       "      <th>qk</th>\n",
       "      <th>time</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>0.240993</td>\n",
       "      <td>0.223846</td>\n",
       "      <td>0.868436</td>\n",
       "      <td>00:55</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>0.233788</td>\n",
       "      <td>0.224082</td>\n",
       "      <td>0.868068</td>\n",
       "      <td>00:55</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>0.258126</td>\n",
       "      <td>0.223755</td>\n",
       "      <td>0.868068</td>\n",
       "      <td>00:55</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>0.237537</td>\n",
       "      <td>0.223823</td>\n",
       "      <td>0.868068</td>\n",
       "      <td>00:55</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>0.241148</td>\n",
       "      <td>0.223723</td>\n",
       "      <td>0.868436</td>\n",
       "      <td>00:56</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>5</td>\n",
       "      <td>0.227877</td>\n",
       "      <td>0.224696</td>\n",
       "      <td>0.867569</td>\n",
       "      <td>00:55</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>6</td>\n",
       "      <td>0.223227</td>\n",
       "      <td>0.224812</td>\n",
       "      <td>0.868948</td>\n",
       "      <td>00:56</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>7</td>\n",
       "      <td>0.221751</td>\n",
       "      <td>0.225059</td>\n",
       "      <td>0.868948</td>\n",
       "      <td>00:55</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table><p>\n",
       "\n",
       "    <div>\n",
       "        <style>\n",
       "            /* Turns off some styling */\n",
       "            progress {\n",
       "                /* gets rid of default border in Firefox and Opera. */\n",
       "                border: none;\n",
       "                /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "                background-size: auto;\n",
       "            }\n",
       "            .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "                background: #F44336;\n",
       "            }\n",
       "        </style>\n",
       "      <progress value='31' class='' max='31', style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      100.00% [31/31 00:05<00:00]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/ai/anaconda3/lib/python3.6/site-packages/sklearn/metrics/classification.py:576: RuntimeWarning: invalid value encountered in true_divide\n",
      "  k = np.sum(w_mat * confusion) / np.sum(w_mat * expected)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Better model found at epoch 0 with valid_loss value: 0.22384603321552277.\n",
      "Better model found at epoch 2 with valid_loss value: 0.22375503182411194.\n",
      "Better model found at epoch 4 with valid_loss value: 0.22372251749038696.\n",
      "Epoch 8: early stopping\n",
      "Model save as: efficientnet-b5_0903_01-03-41_stage2_f2\n"
     ]
    }
   ],
   "source": [
    "model_save_name = \"{}_{}_stage2_f2\".format(model_name, current_time)\n",
    "# min_grad_lr = learn.recorder.min_grad_lr\n",
    "learn.fit_one_cycle(40, 1e-6, callbacks=[SaveModelCallback(learn, every='improvement', name=model_save_name)])\n",
    "print(\"Model save as:\", model_save_name)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-09-02T18:13:41.043557Z",
     "start_time": "2019-09-02T18:13:40.560676Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "learn.recorder.plot_losses()\n",
    "learn.recorder.plot_metrics()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-09-02T18:13:43.590660Z",
     "start_time": "2019-09-02T18:13:41.046239Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Reload efficientnet-b5_0903_01-03-41_stage2_f2\n"
     ]
    }
   ],
   "source": [
    "learn.load(model_save_name)\n",
    "print(\"Reload\", model_save_name)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Fold 3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-20T14:56:55.254016Z",
     "start_time": "2019-08-20T14:56:52.126046Z"
    }
   },
   "outputs": [],
   "source": [
    "data1 = (ImageList.from_df(df=df_2019_cv,path='../input/aptos2019-blindness-detection',cols='id_code', folder='train_images_ben_preprocessing_sigmaX10', suffix='.png')\n",
    "        .split_from_df(\"is_valid3\")\n",
    "        .label_from_df(cols='diagnosis',label_cls=FloatList) \n",
    "        .transform(tfms,size=sz,resize_method=ResizeMethod.SQUISH,padding_mode='zeros') \n",
    "        .databunch(bs=bs,num_workers=4) \n",
    "        .normalize(imagenet_stats)  \n",
    "       )\n",
    "\n",
    "model_name = 'efficientnet-b5'\n",
    "model = EfficientNet.from_pretrained(model_name, num_classes=1)\n",
    "\n",
    "learn = Learner(data1, \n",
    "                model, \n",
    "                path = \".\",\n",
    "                metrics = [qk],\n",
    "                callback_fns=[partial(EarlyStoppingCallback, min_delta=0, patience=3)],\n",
    "                model_dir = '../output/models/')\n",
    "\n",
    "learn.data.add_test(ImageList.from_df(test_df,\n",
    "                                      '../input/aptos2019-blindness-detection',\n",
    "                                      folder='test_images_ben_preprocessing_sigmaX10',\n",
    "                                      suffix='.png'))\n",
    "\n",
    "learn.load(\"efficientnet-b5_0812_22-06-45_stage1\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-20T15:42:43.958997Z",
     "start_time": "2019-08-20T15:42:13.499960Z"
    }
   },
   "outputs": [],
   "source": [
    "# Explore lr from `start_lr` to `end_lr` over `num_it` iterations in `learn`. If `stop_div`, stops when loss diverges.\n",
    "learn.lr_find() \n",
    "learn.recorder.plot(suggestion=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-20T15:40:27.268280Z",
     "start_time": "2019-08-20T15:26:31.376338Z"
    }
   },
   "outputs": [],
   "source": [
    "model_save_name = \"{}_{}_stage2_f3\".format(model_name, current_time)\n",
    "# min_grad_lr = learn.recorder.min_grad_lr\n",
    "learn.fit_one_cycle(40, 1e-6, callbacks=[SaveModelCallback(learn, every='improvement', name=model_save_name)])\n",
    "print(\"Model save as:\", model_save_name)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-20T15:40:27.945596Z",
     "start_time": "2019-08-20T15:40:27.271436Z"
    }
   },
   "outputs": [],
   "source": [
    "learn.recorder.plot_losses()\n",
    "learn.recorder.plot_metrics()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-20T15:40:31.043443Z",
     "start_time": "2019-08-20T15:40:27.947413Z"
    }
   },
   "outputs": [],
   "source": [
    "learn.load(model_save_name)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Fold 4"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-20T17:31:19.092308Z",
     "start_time": "2019-08-20T17:31:15.322896Z"
    }
   },
   "outputs": [],
   "source": [
    "data1 = (ImageList.from_df(df=df_2019_cv,path='../input/aptos2019-blindness-detection',cols='id_code', folder='train_images_ben_preprocessing_sigmaX10', suffix='.png')\n",
    "        .split_from_df(\"is_valid4\")\n",
    "        .label_from_df(cols='diagnosis',label_cls=FloatList) \n",
    "        .transform(tfms,size=sz,resize_method=ResizeMethod.SQUISH,padding_mode='zeros') \n",
    "        .databunch(bs=bs,num_workers=4) \n",
    "        .normalize(imagenet_stats)  \n",
    "       )\n",
    "\n",
    "model_name = 'efficientnet-b5'\n",
    "model = EfficientNet.from_pretrained(model_name, num_classes=1)\n",
    "\n",
    "learn = Learner(data1, \n",
    "                model, \n",
    "                path = \".\",\n",
    "                metrics = [qk],\n",
    "                callback_fns=[partial(EarlyStoppingCallback, min_delta=0, patience=3)],\n",
    "                model_dir = '../output/models/')\n",
    "\n",
    "learn.data.add_test(ImageList.from_df(test_df,\n",
    "                                      '../input/aptos2019-blindness-detection',\n",
    "                                      folder='test_images_ben_preprocessing_sigmaX10',\n",
    "                                      suffix='.png'))\n",
    "\n",
    "learn.load(\"efficientnet-b5_0812_22-06-45_stage1\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-20T16:03:36.296843Z",
     "start_time": "2019-08-20T16:03:05.195502Z"
    }
   },
   "outputs": [],
   "source": [
    "# Explore lr from `start_lr` to `end_lr` over `num_it` iterations in `learn`. If `stop_div`, stops when loss diverges.\n",
    "learn.lr_find() \n",
    "learn.recorder.plot(suggestion=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-20T17:35:08.115988Z",
     "start_time": "2019-08-20T17:31:26.065339Z"
    }
   },
   "outputs": [],
   "source": [
    "model_save_name = \"{}_{}_stage2_f4\".format(model_name, current_time)\n",
    "# min_grad_lr = learn.recorder.min_grad_lr\n",
    "learn.fit_one_cycle(40, 1e-6, callbacks=[SaveModelCallback(learn, every='improvement', name=model_save_name)])\n",
    "print(\"Model save as:\", model_save_name)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-20T17:35:08.520229Z",
     "start_time": "2019-08-20T17:35:08.117870Z"
    }
   },
   "outputs": [],
   "source": [
    "learn.recorder.plot_losses()\n",
    "learn.recorder.plot_metrics()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-20T17:35:10.671801Z",
     "start_time": "2019-08-20T17:35:08.522018Z"
    }
   },
   "outputs": [],
   "source": [
    "learn.load(model_save_name)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Fold 5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-20T16:27:20.655184Z",
     "start_time": "2019-08-20T16:26:53.031248Z"
    }
   },
   "outputs": [],
   "source": [
    "data1 = (ImageList.from_df(df=df_2019_cv,path='../input/aptos2019-blindness-detection',cols='id_code', folder='train_images_ben_preprocessing_sigmaX10', suffix='.png')\n",
    "        .split_from_df(\"is_valid5\")\n",
    "        .label_from_df(cols='diagnosis',label_cls=FloatList) \n",
    "        .transform(tfms,size=sz,resize_method=ResizeMethod.SQUISH,padding_mode='zeros') \n",
    "        .databunch(bs=bs,num_workers=4) \n",
    "        .normalize(imagenet_stats)  \n",
    "       )\n",
    "\n",
    "model_name = 'efficientnet-b5'\n",
    "model = EfficientNet.from_pretrained(model_name, num_classes=1)\n",
    "\n",
    "learn = Learner(data1, \n",
    "                model, \n",
    "                path = \".\",\n",
    "                metrics = [qk],\n",
    "                callback_fns=[partial(EarlyStoppingCallback, min_delta=0, patience=3)],\n",
    "                model_dir = '../output/models/')\n",
    "\n",
    "learn.data.add_test(ImageList.from_df(test_df,\n",
    "                                      '../input/aptos2019-blindness-detection',\n",
    "                                      folder='test_images_ben_preprocessing_sigmaX10',\n",
    "                                      suffix='.png'))\n",
    "\n",
    "learn.load(\"efficientnet-b5_0812_22-06-45_stage1\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-20T16:55:50.771092Z",
     "start_time": "2019-08-20T16:55:25.993004Z"
    }
   },
   "outputs": [],
   "source": [
    "# Explore lr from `start_lr` to `end_lr` over `num_it` iterations in `learn`. If `stop_div`, stops when loss diverges.\n",
    "learn.lr_find() \n",
    "learn.recorder.plot(suggestion=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-20T17:01:42.806311Z",
     "start_time": "2019-08-20T16:58:01.695362Z"
    }
   },
   "outputs": [],
   "source": [
    "model_save_name = \"{}_{}_stage2_f5\".format(model_name, current_time)\n",
    "min_grad_lr = learn.recorder.min_grad_lr\n",
    "learn.fit_one_cycle(40, min_grad_lr, callbacks=[SaveModelCallback(learn, every='improvement', name=model_save_name)])\n",
    "print(\"Model save as:\", model_save_name)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-20T17:01:43.192542Z",
     "start_time": "2019-08-20T17:01:42.808138Z"
    }
   },
   "outputs": [],
   "source": [
    "learn.recorder.plot_losses()\n",
    "learn.recorder.plot_metrics()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-20T17:01:45.007840Z",
     "start_time": "2019-08-20T17:01:43.194221Z"
    }
   },
   "outputs": [],
   "source": [
    "learn.load(model_save_name)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-23T10:24:55.109028Z",
     "start_time": "2019-08-23T10:24:54.613291Z"
    }
   },
   "outputs": [],
   "source": [
    "learn.export(\"../output/inference/{}.pkl\".format(model_save_name))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Submission"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-19T16:51:10.929998Z",
     "start_time": "2019-08-19T16:51:10.901336Z"
    }
   },
   "source": [
    "## Fold 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-19T20:28:22.704481Z",
     "start_time": "2019-08-19T20:28:13.666620Z"
    }
   },
   "outputs": [],
   "source": [
    "optR = OptimizedRounder()\n",
    "preds,y = learn.get_preds(DatasetType.Test)\n",
    "tst_pred = optR.predict(preds, [0.5, 1.5, 2.5, 3.5])\n",
    "test_df.diagnosis = tst_pred.astype(int)\n",
    "\n",
    "save_filename = '{}_submition.csv'.format(model_save_name)\n",
    "test_df.to_csv(save_filename,index=False)\n",
    "print (save_filename, 'done')\n",
    "\n",
    "test_df.hist()\n",
    "plt.show()\n",
    "\n",
    "old.diagnosis.corr(test_df.diagnosis)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-19T16:51:10.929998Z",
     "start_time": "2019-08-19T16:51:10.901336Z"
    }
   },
   "source": [
    "## Fold 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-09-02T18:58:52.847359Z",
     "start_time": "2019-09-02T18:58:43.510312Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "../output/submission/efficientnet-b5_0903_01-03-41_stage2_f2.csv done\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYAAAAEICAYAAABWJCMKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAFVNJREFUeJzt3X+QXeV93/H3J4hfRg7C4ChYUix3TEkoNA5sMYmbzMpkEn44QBNoSYkRDKmmrR3j4kwhnmmJk7TBnRD/oB17ZEONDbHAxA0EcG0KqK7TQo0wQWBCEA7FAoKMBcKycWzsb/+4B7NeVtq99+7eu+h5v2Z29vx4znm+99He/ex57r1HqSokSe35kXEXIEkaDwNAkhplAEhSowwASWqUASBJjTIAJKlRBoD2aEk+luQPkvx8kgfHXc+uJHl3ko+Ouw61Zcm4C5BGoar+F3D4uOvYlar6j+OuQe3xCkCSGmUAaI+S5GeS3J3kG0muAfbrtk8m2Tql3UVJHu7afTnJP5myb68klyZ5KsnfJHl7kkqypNu/McnvJ/mL7vjPJTlkyvGnJLk/yTNd25+asu/CJI91xz2Y5Phu++8muapb3i/JVUm+3p3ji0mWL/jgqTkGgPYYSfYB/gz4BPAq4FPAr+2i+cPAzwMHAu8BrkpyaLfvXwAnAm8AjgZOm+H4fw6cC/wYsA/w210Nfx/4JPBO4NXAzcCfJ9knyeHA24F/VFWvBH4ZeGSGc6/t6loFHAz8S+C5uYyB1A8DQHuS44C9gfdX1Xer6jrgizM1rKpPVdXjVfX9qroGeAg4ttv9T4EPVNXWqnoauGSGU/zXqvrrqnoOuJZeWAD8M+Cmqrqlqr4L/BGwP/BzwPeAfYEjkuxdVY9U1cMznPu79H7xv76qvldVm6rq2f6HQ9o9A0B7ktcAj9UP3+Hw/83UMMnZSe7pplieAY4EXpjGeQ3w1SnNv/qSE8DfTln+FrB0yrE/6LOqvt8dv6KqttC7MvhdYFuSDUleM8O5PwF8FtiQ5PEk/ynJ3jM+YmkIBoD2JE8AK5JkyrafmN4oyWuBj9Cbjjm4qpYB9wEvHPcEsHLKIav6qOFx4LVT+kp3/GMAVfUnVfWPuzYFvHf6Cbqrl/dU1RH0rhzeApzdRw3SnBgA2pP8H+B54B1JliT5VV6c1pnqAHq/fL8GkORcelcAL7gWOD/JiiTLgAv7qOFa4OQkx3d/tb8L+Dvgfyc5PMmbk+wLfJvevP73pp8gyZokRyXZC3iW3pTQS9pJwzIAtMeoqu8AvwqcAzxNbz7+0zO0+zJwKb3AeBI4CviLKU0+AnwOuBf4Er0Xcp9nDr+Eq+pB4DeAy4CngF8BfqWrbV96ryc8RW8K6ceAd89wmh8HrqP3y/8B4H8CV83Wt9Sv+B/CSLuX5ETgw1X12lkbSy8jXgFI0yTZP8lJ3TTSCuBi4L+Nuy5pvnkFIE2T5BX0pl1+kt48/U3A+b4VU3saA0CSGuUUkCQ1alHfDfSQQw6p1atXD3z8N7/5TQ444ID5K2ieWFd/rKs/1tWfPbGuTZs2PVVVr561YVUt2q9jjjmmhnH77bcPdfxCsa7+WFd/rKs/e2JdwF01h9+xTgFJUqMMAElqlAEgSY0yACSpUQaAJDXKAJCkRhkAktQoA0CSGmUASFKjFvWtIKTFbPNjOzjnoptG3u8jl5w88j61Z/IKQJIaZQBIUqMMAElqlAEgSY0yACSpUQaAJDXKAJCkRhkAktQoA0CSGmUASFKjDABJatSsAZDkiiTbktw3ZdurktyS5KHu+0Hd9iT5YJItSe5NcvSUY9Z27R9KsnZhHo4kaa7mcgXwMeCEadsuAm6tqsOAW7t1gBOBw7qvdcCHoBcYwMXAG4FjgYtfCA1J0njMGgBV9Xlg+7TNpwJXdstXAqdN2f7x6rkDWJbkUOCXgVuqantVPQ3cwktDRZI0Qqmq2Rslq4Ebq+rIbv2Zqlo2Zf/TVXVQkhuBS6rqC932W4ELgUlgv6r6g277vwOeq6o/mqGvdfSuHli+fPkxGzZsGPjB7dy5k6VLlw58/EKxrv4s1rq2bd/Bk8+Nvt+jVhy42/2Ldbysqz/D1LVmzZpNVTUxW7v5/v8AMsO22s32l26sWg+sB5iYmKjJycmBi9m4cSPDHL9QrKs/i7Wuy66+nks3j/6/1HjkrMnd7l+s42Vd/RlFXYO+C+jJbmqH7vu2bvtWYNWUdiuBx3ezXZI0JoMGwA3AC+/kWQtcP2X72d27gY4DdlTVE8BngV9KclD34u8vddskSWMy6/Vrkk/Sm8M/JMlWeu/muQS4Nsl5wKPAGV3zm4GTgC3At4BzAapqe5LfB77Ytfu9qpr+wrIkaYRmDYCq+vVd7Dp+hrYFvG0X57kCuKKv6iRJC8ZPAktSowwASWqUASBJjTIAJKlRBoAkNcoAkKRGGQCS1CgDQJIaZQBIUqMMAElqlAEgSY0yACSpUQaAJDXKAJCkRhkAktQoA0CSGmUASFKjDABJapQBIEmNMgAkqVEGgCQ1ygCQpEYZAJLUKANAkhplAEhSowwASWqUASBJjTIAJKlRBoAkNWqoAEjyb5Lcn+S+JJ9Msl+S1yW5M8lDSa5Jsk/Xdt9ufUu3f/V8PABJ0mAGDoAkK4B3ABNVdSSwF3Am8F7gfVV1GPA0cF53yHnA01X1euB9XTtJ0pgMOwW0BNg/yRLgFcATwJuB67r9VwKndcundut0+49PkiH7lyQNKFU1+MHJ+cB/AJ4DPgecD9zR/ZVPklXAZ6rqyCT3ASdU1dZu38PAG6vqqWnnXAesA1i+fPkxGzZsGLi+nTt3snTp0oGPXyjW1Z/FWte27Tt48rnR93vUigN3u3+xjpd19WeYutasWbOpqiZma7dkoLMDSQ6i91f964BngE8BJ87Q9IWEmemv/ZekT1WtB9YDTExM1OTk5KAlsnHjRoY5fqFYV38Wa12XXX09l24e+Ck0sEfOmtzt/sU6XtbVn1HUNcwU0C8Cf1NVX6uq7wKfBn4OWNZNCQGsBB7vlrcCqwC6/QcC24foX5I0hGEC4FHguCSv6Obyjwe+DNwOnN61WQtc3y3f0K3T7b+thpl/kiQNZeAAqKo76b2YezewuTvXeuBC4IIkW4CDgcu7Qy4HDu62XwBcNETdkqQhDTWBWVUXAxdP2/wV4NgZ2n4bOGOY/iRJ88dPAktSowwASWqUASBJjTIAJKlRBoAkNcoAkKRGGQCS1CgDQJIaZQBIUqMMAElqlAEgSY0yACSpUQaAJDXKAJCkRhkAktQoA0CSGmUASFKjDABJapQBIEmNMgAkqVEGgCQ1ygCQpEYZAJLUKANAkhplAEhSowwASWqUASBJjTIAJKlRBoAkNcoAkKRGDRUASZYluS7JXyV5IMnPJnlVkluSPNR9P6hrmyQfTLIlyb1Jjp6fhyBJGsSwVwAfAP57Vf0k8NPAA8BFwK1VdRhwa7cOcCJwWPe1DvjQkH1LkoYwcAAk+VHgF4DLAarqO1X1DHAqcGXX7ErgtG75VODj1XMHsCzJoQNXLkkaSqpqsAOTNwDrgS/T++t/E3A+8FhVLZvS7umqOijJjcAlVfWFbvutwIVVdde0866jd4XA8uXLj9mwYcNA9QHs3LmTpUuXDnz8QrGu/izWurZt38GTz42+36NWHLjb/Yt1vKyrP8PUtWbNmk1VNTFbuyUDnf3FY48Gfquq7kzyAV6c7plJZtj2kvSpqvX0goWJiYmanJwcuMCNGzcyzPELxbr6s1jruuzq67l08zBPocE8ctbkbvcv1vGyrv6Moq5hXgPYCmytqju79evoBcKTL0ztdN+3TWm/asrxK4HHh+hfkjSEgQOgqv4W+GqSw7tNx9ObDroBWNttWwtc3y3fAJzdvRvoOGBHVT0xaP+SpOEMe/36W8DVSfYBvgKcSy9Urk1yHvAocEbX9mbgJGAL8K2urSRpTIYKgKq6B5jphYbjZ2hbwNuG6U+SNH/8JLAkNcoAkKRGGQCS1CgDQJIaZQBIUqMMAElqlAEgSY0yACSpUQaAJDXKAJCkRhkAktQoA0CSGmUASFKjDABJapQBIEmNMgAkqVEGgCQ1ygCQpEYZAJLUKANAkhplAEhSowwASWqUASBJjTIAJKlRBoAkNcoAkKRGGQCS1CgDQJIaZQBIUqOGDoAkeyX5UpIbu/XXJbkzyUNJrkmyT7d93259S7d/9bB9S5IGNx9XAOcDD0xZfy/wvqo6DHgaOK/bfh7wdFW9Hnhf106SNCZDBUCSlcDJwEe79QBvBq7rmlwJnNYtn9qt0+0/vmsvSRqDVNXgByfXAX8IvBL4beAc4I7ur3ySrAI+U1VHJrkPOKGqtnb7HgbeWFVPTTvnOmAdwPLly4/ZsGHDwPXt3LmTpUuXDnz8QrGu/izWurZt38GTz42+36NWHLjb/Yt1vKyrP8PUtWbNmk1VNTFbuyUDnR1I8hZgW1VtSjL5wuYZmtYc9r24oWo9sB5gYmKiJicnpzeZs40bNzLM8QvFuvqzWOu67OrruXTzwE+hgT1y1uRu9y/W8bKu/oyirmF+et8EnJLkJGA/4EeB9wPLkiypqueBlcDjXfutwCpga5IlwIHA9iH6lyQNYeDXAKrqd6pqZVWtBs4Ebquqs4DbgdO7ZmuB67vlG7p1uv231TDzT5KkoSzE5wAuBC5IsgU4GLi82345cHC3/QLgogXoW5I0R/MygVlVG4GN3fJXgGNnaPNt4Iz56E+SNDw/CSxJjTIAJKlRBoAkNcoAkKRGGQCS1KjRf4xxhDY/toNzLrpp5P0+csnJI+9TkvrlFYAkNcoAkKRGGQCS1CgDQJIaZQBIUqMMAElqlAEgSY0yACSpUQaAJDXKAJCkRhkAktQoA0CSGmUASFKjDABJatQefTtoSfNr9RC3V3/XUc8PfHt2b7G+MLwCkKRGGQCS1CgDQJIaZQBIUqMMAElqlAEgSY0yACSpUQaAJDVq4ABIsirJ7UkeSHJ/kvO77a9KckuSh7rvB3Xbk+SDSbYkuTfJ0fP1ICRJ/RvmCuB54F1V9VPAccDbkhwBXATcWlWHAbd26wAnAod1X+uADw3RtyRpSAMHQFU9UVV3d8vfAB4AVgCnAld2za4ETuuWTwU+Xj13AMuSHDpw5ZKkoaSqhj9Jshr4PHAk8GhVLZuy7+mqOijJjcAlVfWFbvutwIVVdde0c62jd4XA8uXLj9mwYcPAdW3bvoMnnxv48IEdteLA3e7fuXMnS5cuHVE1c2dd/Wnx52vzYzsGPnb5/gw8XrM95mEs1p+vYepas2bNpqqamK3d0DeDS7IU+FPgnVX1bJJdNp1h20vSp6rWA+sBJiYmanJycuDaLrv6ei7dPPr73T1y1uRu92/cuJFhHtdCsa7+tPjzNejN3KB3M7hBx2u2xzyMxfrzNYq6hvrpTbI3vV/+V1fVp7vNTyY5tKqe6KZ4tnXbtwKrphy+Enh8mP71w4a5UyN4t0apNcO8CyjA5cADVfXHU3bdAKztltcC10/Zfnb3bqDjgB1V9cSg/UuShjPMFcCbgLcCm5Pc0217N3AJcG2S84BHgTO6fTcDJwFbgG8B5w7RtyRpSAMHQPdi7q4m/I+foX0Bbxu0P0nS/PKTwJLUKANAkhplAEhSowwASWqUASBJjTIAJKlRBoAkNcoAkKRGGQCS1CgDQJIaZQBIUqMMAElqlAEgSY0yACSpUQaAJDXKAJCkRhkAktQoA0CSGmUASFKjDABJapQBIEmNMgAkqVEGgCQ1asm4C5CkxWr1RTeNre+PnXDAgvfhFYAkNcoAkKRGGQCS1CgDQJIaZQBIUqMMAElq1MgDIMkJSR5MsiXJRaPuX5LUM9IASLIX8F+AE4EjgF9PcsQoa5Ak9Yz6CuBYYEtVfaWqvgNsAE4dcQ2SJCBVNbrOktOBE6rqN7v1twJvrKq3T2mzDljXrR4OPDhEl4cATw1x/EKxrv5YV3+sqz97Yl2vrapXz9Zo1LeCyAzbfiiBqmo9sH5eOkvuqqqJ+TjXfLKu/lhXf6yrPy3XNeopoK3AqinrK4HHR1yDJInRB8AXgcOSvC7JPsCZwA0jrkGSxIingKrq+SRvBz4L7AVcUVX3L2CX8zKVtACsqz/W1R/r6k+zdY30RWBJ0uLhJ4ElqVEGgCQ16mUfALPdWiLJvkmu6fbfmWT1IqnrnCRfS3JP9/WbI6rriiTbkty3i/1J8sGu7nuTHL1I6ppMsmPKeP37EdW1KsntSR5Icn+S82doM/Ixm2NdIx+zJPsl+b9J/rKr6z0ztBn5c3KOdY3rOblXki8luXGGfQs7VlX1sv2i90Lyw8DfA/YB/hI4Ylqbfw18uFs+E7hmkdR1DvCfxzBmvwAcDdy3i/0nAZ+h95mN44A7F0ldk8CNYxivQ4Gju+VXAn89w7/lyMdsjnWNfMy6MVjaLe8N3AkcN63NOJ6Tc6lrXM/JC4A/menfaqHH6uV+BTCXW0ucClzZLV8HHJ9kpg+kjbqusaiqzwPbd9PkVODj1XMHsCzJoYugrrGoqieq6u5u+RvAA8CKac1GPmZzrGvkujHY2a3u3X1Nf6fJyJ+Tc6xr5JKsBE4GPrqLJgs6Vi/3AFgBfHXK+lZe+iT4QZuqeh7YARy8COoC+LVuyuC6JKtm2D8Oc619HH62u4T/TJJ/MOrOu8vvn6H31+NUYx2z3dQFYxizbkrjHmAbcEtV7XK8RvicnEtdMPrn5PuBfwt8fxf7F3SsXu4BMOutJebYZr7Npc8/B1ZX1T8E/gcvpvy4jWO85uJuevc3+WngMuDPRtl5kqXAnwLvrKpnp++e4ZCRjNksdY1lzKrqe1X1Bnqf9D82yZHTmoxlvOZQ10ifk0neAmyrqk27azbDtnkbq5d7AMzl1hI/aJNkCXAgCz/VMGtdVfX1qvq7bvUjwDELXNNcLcrbdVTVsy9cwlfVzcDeSQ4ZRd9J9qb3S/bqqvr0DE3GMmaz1TXOMev6fAbYCJwwbdc4npOz1jWG5+SbgFOSPEJvmvjNSa6a1mZBx+rlHgBzubXEDcDabvl04LbqXlEZZ13T5ohPoTeHuxjcAJzdvbPlOGBHVT0x7qKS/PgLc59JjqX3s/v1EfQb4HLggar64100G/mYzaWucYxZklcnWdYt7w/8IvBX05qN/Dk5l7pG/Zysqt+pqpVVtZre74jbquo3pjVb0LEa9d1A51Xt4tYSSX4PuKuqbqD3JPlEki30kvPMRVLXO5KcAjzf1XXOQtcFkOST9N4dckiSrcDF9F4Qo6o+DNxM710tW4BvAecukrpOB/5VkueB54AzRxDk0Psr7a3A5m7+GODdwE9MqW0cYzaXusYxZocCV6b3nz/9CHBtVd047ufkHOsay3NyulGOlbeCkKRGvdyngCRJAzIAJKlRBoAkNcoAkKRGGQCS1CgDQJIaZQBIUqP+P6jM1dM8gl6qAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "preds,y = learn.get_preds(DatasetType.Test)\n",
    "tst_pred = np.round(preds.numpy())\n",
    "test_df.diagnosis = tst_pred.astype(int)\n",
    "\n",
    "save_filename = '../output/submission/{}.csv'.format(model_save_name)\n",
    "test_df.to_csv(save_filename,index=False)\n",
    "print (save_filename, 'done')\n",
    "\n",
    "test_df.hist()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-19T16:51:10.929998Z",
     "start_time": "2019-08-19T16:51:10.901336Z"
    }
   },
   "source": [
    "## Fold 3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-20T15:44:01.235906Z",
     "start_time": "2019-08-20T15:43:46.639449Z"
    }
   },
   "outputs": [],
   "source": [
    "optR = OptimizedRounder()\n",
    "preds,y = learn.get_preds(DatasetType.Test)\n",
    "tst_pred = optR.predict(preds, [0.5, 1.5, 2.5, 3.5])\n",
    "test_df.diagnosis = tst_pred.astype(int)\n",
    "\n",
    "save_filename = '{}_submition.csv'.format(model_save_name)\n",
    "test_df.to_csv(save_filename,index=False)\n",
    "print (save_filename, 'done')\n",
    "\n",
    "test_df.hist()\n",
    "plt.show()\n",
    "\n",
    "old.diagnosis.corr(test_df.diagnosis)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-19T16:51:10.929998Z",
     "start_time": "2019-08-19T16:51:10.901336Z"
    }
   },
   "source": [
    "## Fold 4"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-20T17:35:19.692367Z",
     "start_time": "2019-08-20T17:35:10.937214Z"
    }
   },
   "outputs": [],
   "source": [
    "optR = OptimizedRounder()\n",
    "preds,y = learn.get_preds(DatasetType.Test)\n",
    "tst_pred = optR.predict(preds, [0.5, 1.5, 2.5, 3.5])\n",
    "test_df.diagnosis = tst_pred.astype(int)\n",
    "\n",
    "save_filename = '{}_submition.csv'.format(model_save_name)\n",
    "test_df.to_csv(save_filename,index=False)\n",
    "print (save_filename, 'done')\n",
    "\n",
    "test_df.hist()\n",
    "plt.show()\n",
    "\n",
    "old.diagnosis.corr(test_df.diagnosis)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-19T16:51:10.929998Z",
     "start_time": "2019-08-19T16:51:10.901336Z"
    }
   },
   "source": [
    "## Fold 5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-20T17:05:02.593451Z",
     "start_time": "2019-08-20T17:04:53.856227Z"
    }
   },
   "outputs": [],
   "source": [
    "optR = OptimizedRounder()\n",
    "preds,y = learn.get_preds(DatasetType.Test)\n",
    "tst_pred = optR.predict(preds, [0.5, 1.5, 2.5, 3.5])\n",
    "test_df.diagnosis = tst_pred.astype(int)\n",
    "\n",
    "save_filename = '{}_submition.csv'.format(model_save_name)\n",
    "test_df.to_csv(save_filename,index=False)\n",
    "print (save_filename, 'done')\n",
    "\n",
    "test_df.hist()\n",
    "plt.show()\n",
    "\n",
    "old.diagnosis.corr(test_df.diagnosis)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {
    "height": "calc(100% - 180px)",
    "left": "10px",
    "top": "150px",
    "width": "256px"
   },
   "toc_section_display": true,
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
